package Dao.PostgreSql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import Dao.GenericDao;
import Entity.Quitacao;
import Entity.Titulo;
import Interface.InterfaceDao;

public class QuitacaoPostgreSqlDao extends GenericDao implements InterfaceDao {

	@Override
	public List<Object> findAll() {
		List<Object> lista = new ArrayList<Object>();
		try {
			// cria o objeto de conexao
			Connection conn = conexao();

			// monta o sql de insert
			String query = "select * from Quitacao";

			// cria os parametros a serem passados no insert
			PreparedStatement preparedStmt = conn.prepareStatement(query);

			// executa o sql
			ResultSet q = preparedStmt.executeQuery();

			Quitacao f;
			while (q.next()) {
				f = new Quitacao();
				f.setId(q.getInt("id"));
				Titulo titulo = new Titulo();
				titulo.setId(q.getInt("idTitulo"));
				f.setTitulo(titulo);
				f.setValorPago(q.getDouble("valorPago"));
				f.setDataPagamento(q.getDate("dataPagamento"));

				lista.add(f);
			}

			conn.close();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro ao consultar todos!");
			System.err.println(e.getMessage());
		}
		return lista;
	}
	
	@Override
	public List<Object> findAllById(int id) {
		List<Object> lista = new ArrayList<Object>();
		try {
			// cria o objeto de conexao
			Connection conn = conexao();

			// monta o sql de insert
			String query = "select * from Quitacao where \"idTitulo\" = ?";

			// cria os parametros a serem passados no insert
			PreparedStatement preparedStmt = conn.prepareStatement(query);
			preparedStmt.setInt(1, id);

			// executa o sql
			ResultSet q = preparedStmt.executeQuery();

			Quitacao f;
			while (q.next()) {
				f = new Quitacao();
				f.setId(q.getInt("id"));
				Titulo titulo = new Titulo();
				titulo.setId(q.getInt("idTitulo"));
				f.setTitulo(titulo);
				f.setValorPago(q.getDouble("valorPago"));
				f.setDataPagamento(q.getDate("dataPagamento"));

				lista.add(f);
			}

			conn.close();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro ao consultar todos!");
			System.err.println(e.getMessage());
		}
		return lista;
	}

	@Override
	public void insert(Object obj) {
		try {
			Quitacao objF = (Quitacao) obj;
			// cria o objeto de conexao
			Connection conn = conexao();

			// monta o sql de insert
			String query = " insert into Quitacao values (default, ?, ?, ?)";

			// cria os parametros a serem passados no insert
			PreparedStatement preparedStmt = conn.prepareStatement(query);
			preparedStmt.setInt(1, objF.getTitulo().getId());
			preparedStmt.setDouble(2, objF.getValorPago());
			preparedStmt.setDate(3, new Date(objF.getDataPagamento().getTime()));

			// executa o sql
			preparedStmt.execute();

			conn.close();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro ao inserir!");
			System.err.println(e.getMessage());
		}
	}

	@Override
	public void update(Object obj) {
		try {
			Quitacao objF = (Quitacao) obj;
			// cria o objeto de conexao
			Connection conn = conexao();

			// monta o sql de insert
			String query = " update Quitacao set \"idTitulo\" = ?, \"valorPago\" = ?, \"dataPagamento\" = ? where id = ?";

			// cria os parametros a serem passados no insert
			PreparedStatement preparedStmt = conn.prepareStatement(query);
			preparedStmt.setInt(1, objF.getTitulo().getId());
			preparedStmt.setDouble(2, objF.getValorPago());
			preparedStmt.setDate(3, new Date(objF.getDataPagamento().getTime()));
			preparedStmt.setInt(4, objF.getId());

			// executa o sql
			preparedStmt.execute();

			conn.close();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro ao alterar!");
			System.err.println(e.getMessage());
		}
	}

	@Override
	public void delete(int id) {
		try {
			// cria o objeto de conexao
			Connection conn = conexao();

			// monta o sql de insert
			String query = " delete from Quitacao where id = ?";

			// cria os parametros a serem passados no insert
			PreparedStatement preparedStmt = conn.prepareStatement(query);
			preparedStmt.setInt(1, id);

			// executa o sql
			preparedStmt.execute();

			conn.close();
		} catch (Exception e) {
			System.err.println("Ocorreu um erro ao excluir!");
			System.err.println(e.getMessage());
		}
	}

	@Override
	public List<Object> findVencimentos(int dias) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void updateAviso(int aviso, int id) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public List<Object> findVencimentosMes() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Object> findClienteAviso() {
		// TODO Auto-generated method stub
		return null;
	}
}
